تأمين تطبيق Node.js يعمل على الحاويات باستخدام Nginx و Let’s Encrypt و Docker Compose
في عصر الأنظمة المتطورة والموارد السحابية، أصبح من الضروري تأمين تطبيقات الويب، سواء كانت تعمل على الخوادم التقليدية أو الحاويات (Containers). في هذا السياق، سنعرض كيفية تأمين تطبيق Node.js يعمل في بيئة حاويات باستخدام Nginx كخادم عكسي (Reverse Proxy)، و Let’s Encrypt للحصول على شهادات SSL مجانية، بالإضافة إلى استخدام Docker Compose لإدارة الحاويات بشكل فعال.
مقدمة
يعد Node.js منصة مفتوحة المصدر لبناء تطبيقات الخوادم باستخدام JavaScript. على الرغم من قوتها وسرعتها في التعامل مع الطلبات المتعددة، إلا أن تأمينها في بيئة الإنتاج يعد أمرًا بالغ الأهمية. من أجل ضمان سرية البيانات وتوفير اتصال آمن، نحتاج إلى استخدام تقنيات مثل SSL/TLS لتشفير الاتصال بين الخوادم والعملاء. واحدة من أسهل وأرخص الطرق للحصول على شهادات SSL هي عبر Let’s Encrypt، الذي يوفر شهادات SSL مجانية.
Nginx، من جهة أخرى، يعد خادماً عكسياً ممتازاً لتمرير الطلبات إلى تطبيقات خلفية مثل Node.js، بالإضافة إلى مزايا إضافية مثل التحكم في حركة المرور، توزيع الحمل، وتحسين الأداء.
أخيرًا، Docker Compose يوفر طريقة مثالية لإدارة التطبيقات متعددة الحاويات، مما يسهل نشر وتوزيع تطبيق Node.js في بيئات معقدة.
المتطلبات الأساسية
قبل البدء في بناء التطبيق وتأمينه، يجب التأكد من أنك تمتلك العناصر الأساسية التالية:
-
خادم Linux: يجب أن يعمل التطبيق على خادم Linux أو جهاز افتراضي.
-
Docker: لتشغيل التطبيقات داخل الحاويات.
-
Docker Compose: لتسهيل إدارة الحاويات.
-
Nginx: لإعداد الخادم العكسي.
-
Let’s Encrypt: للحصول على شهادة SSL.
الخطوة 1: إعداد بيئة Docker
أولاً، تحتاج إلى إنشاء ملفات Docker الخاصة بتطبيق Node.js و Nginx. سيستخدم Docker Compose لربط الحاويات وتسهيل نشرها.
إنشاء ملف Dockerfile لتطبيق Node.js
ابدأ بإنشاء Dockerfile خاص بتطبيق Node.js الذي سيشمل جميع الإعدادات المطلوبة لتشغيل التطبيق في حاوية Docker.
dockerfile# استخدام الصورة الرسمية لـ Node.js FROM node:14 # تعيين المجلد العمل في الحاوية WORKDIR /usr/src/app # نسخ ملفات المشروع إلى الحاوية COPY package*.json ./ # تثبيت التبعيات RUN npm install # نسخ ملفات التطبيق إلى الحاوية COPY . . # تعيين البورت الذي سيعمل عليه التطبيق EXPOSE 3000 # تشغيل التطبيق CMD ["node", "app.js"]
إنشاء ملف docker-compose.yml
الآن، سنقوم بإعداد Docker Compose لربط الحاويات. سيكون لدينا حاويتين: واحدة لتطبيق Node.js والأخرى لـ Nginx.
yamlversion: '3'
services:
node-app:
build: .
container_name: node-app
environment:
- NODE_ENV=production
ports:
- "3000:3000"
nginx:
image: nginx:latest
container_name: nginx
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
ports:
- "80:80"
- "443:443"
depends_on:
- node-app
الخطوة 2: إعداد Nginx كخادم عكسي
نحتاج الآن إلى إعداد Nginx كخادم عكسي لتوجيه الطلبات الواردة من العملاء إلى تطبيق Node.js. ستقوم Nginx بمعالجة حركة المرور على البورت 80 (HTTP) و 443 (HTTPS).
إنشاء ملف nginx.conf
nginxserver {
listen 80;
server_name yourdomain.com www.yourdomain.com;
location / {
proxy_pass http://node-app:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
# إعادة التوجيه إلى HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
location / {
proxy_pass http://node-app:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
في هذا الملف، نعمل على:
-
إعداد الخادم للاستماع على البورتين 80 و 443.
-
إعادة توجيه حركة المرور من HTTP إلى HTTPS.
-
إعداد proxy_pass لتوجيه الطلبات إلى تطبيق Node.js على البورت 3000.
الخطوة 3: إعداد Let’s Encrypt للحصول على شهادة SSL
الخطوة التالية هي إعداد Let’s Encrypt للحصول على شهادة SSL وتثبيتها على Nginx.
تثبيت Certbot
Certbot هو أداة تتيح لك الحصول على شهادة SSL مجانية من Let’s Encrypt وتثبيتها على خادمك.
bashsudo apt update sudo apt install certbot python3-certbot-nginx
الحصول على شهادة SSL
بمجرد تثبيت Certbot، يمكنك الحصول على الشهادة باستخدام الأمر التالي:
bashsudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
سيقوم Certbot تلقائيًا بإنشاء شهادة SSL وتثبيتها على خادم Nginx.
الخطوة 4: إعداد إعادة التحميل التلقائي للشهادات
Let’s Encrypt تصدر الشهادات لمدة 90 يومًا فقط، لذا من الضروري إعداد Cron Job لتجديد الشهادات تلقائيًا.
إعداد Cron Job لتجديد الشهادة
bashsudo crontab -e
ثم أضف السطر التالي لتجديد الشهادة بشكل دوري:
bash0 12 * * * certbot renew --quiet && systemctl reload nginx
الخطوة 5: تشغيل Docker Compose
الآن بعد أن أعددنا جميع الحاويات وتهيئة Nginx و Let’s Encrypt، يمكننا تشغيل التطبيق باستخدام Docker Compose.
تشغيل الحاويات
bashdocker-compose up -d
سيتم الآن تشغيل التطبيق في بيئة الإنتاج باستخدام Docker و Nginx، مع شهادة SSL من Let’s Encrypt.
الخطوة 6: التحقق من عمل التطبيق بشكل صحيح
بمجرد تشغيل الحاويات، يمكنك التحقق من أن كل شيء يعمل بشكل صحيح بفتح متصفحك والانتقال إلى:
arduinohttps://yourdomain.com
يجب أن ترى التطبيق يعمل بشكل صحيح مع اتصال آمن (علامة القفل بجانب الرابط).
الخاتمة
لقد استعرضنا في هذا المقال كيفية تأمين تطبيق Node.js يعمل في بيئة Docker باستخدام Nginx كخادم عكسي، بالإضافة إلى استخدام Let’s Encrypt للحصول على شهادة SSL مجانية. هذه الطريقة توفر بيئة آمنة وسريعة لتطبيقات Node.js، مما يضمن حماية البيانات ومنع التنصت من قبل الأطراف الثالثة.
إعداد Docker Compose يسهل عملية نشر التطبيق وإدارته، مما يجعله خيارًا مثاليًا للمشاريع الصغيرة والمتوسطة. من خلال هذه الخطوات، يمكن للمطورين ضمان أن تطبيقاتهم تعمل في بيئة آمنة، وأن حركة المرور بين المستخدمين والخوادم مشفرة بشكل كامل.

